物联网之lora通讯一:一主多从方案

您所在的位置:网站首页 lora通信模块 上海贝尔 物联网之lora通讯一:一主多从方案

物联网之lora通讯一:一主多从方案

2024-07-13 12:47| 来源: 网络整理| 查看: 265

1、多个从机和1个主机组成,通讯方式为lora。

2、主芯片stm32F1,RF芯片安信可Ra-02,SPI驱动。

3、多个主机可放到一起。(调整lora的相关参数,扩频因子,带宽,编码率,使主从机在一个空中速率。具体见如下说明)。

3、主从机采用一问一答方式通讯,lora全双工,延时20s。

实际项目已经应用,唯一不足就是延时长,RF驱动分享出来,希望可以完善代码。见附件。

/* * THE FOLLOWING FIRMWARE IS PROVIDED: (1) "AS IS" WITH NO WARRANTY; AND * (2)TO ENABLE ACCESS TO CODING INFORMATION TO GUIDE AND FACILITATE CUSTOMER. * CONSEQUENTLY, SEMTECH SHALL NOT BE HELD LIABLE FOR ANY DIRECT, INDIRECT OR * CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT * OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION * CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. * * Copyright (C) SEMTECH S.A. */ /*! * \file sx1276-LoRa.h * \brief SX1276 RF chip driver mode LoRa * * \version 2.0.B2 * \date May 6 2013 * \author Gregory Cristian * * Last modified by Miguel Luis on Jun 19 2013 */ #ifndef __SX1278_LORA_H__ #define __SX1278_LORA_H__ #include "spi.h" #define RF_CS_Low GPIO_ResetBits(GPIOA, GPIO_Pin_4)//PD8 CS #define RF_CS_High GPIO_SetBits(GPIOA, GPIO_Pin_4)// #define RF_SDN_Low GPIO_ResetBits(GPIOB, GPIO_Pin_0)// PD10 SDN #define RF_SDN_High GPIO_SetBits(GPIOB, GPIO_Pin_0)// //#define RF_NIRQ GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_8)//NIRQ #define RF_NIRQ GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11)//NIRQ //----------------------------------------------------------------------------- // 子程序声明 //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // define MCU GPIO //----------------------------------------------------------------------------- u8 SPIRead(u8 adr); void SPIBurstRead(u8 adr, u8 *ptr, u8 length); void RFM96_LoRaEntryRx(void); u8 RFM96_LoRaRxPacket(u8 *buf); u8 RFM96_LoRaEntryTx(u8 packet_length); u8 RFM96_LoRaTxPacket(u8 *buf,u8 len); unsigned char RFM96_Config(u8 mode); unsigned char SX1278_Init(void); unsigned char SX1278_TXD(u8 *buf, u8 size); unsigned char SX1278_RXD(unsigned char *Data); /*! * SX1276 Internal registers Address */ //RFM96 Internal registers Address #define LR_RegFifo 0x0000//FIFO read/write access // Common settings #define LR_RegOpMode 0x0100//Operating mode & LoRaTM / FSK selection #define LR_RegFrMsb 0x0600//RF Carrier Frequency, Most Significant Bits #define LR_RegFrMid 0x0700//RF Carrier Frequency, Most Significant Bits #define LR_RegFrLsb 0x0800//RF Carrier Frequency, Most Significant Bits // Tx settings #define LR_RegPaConfig 0x0900//PA selection and Output Power control #define LR_RegPaRamp 0x0A00//Control of PA ramp time, low phase noise PLL #define LR_RegOcp 0x0B00//Over Current Protection control // Rx settings #define LR_RegLna 0x0C00//LNA settings // LoRa registers #define LR_RegFifoAddrPtr 0x0D00//FIFO SPI pointer #define LR_RegFifoTxBaseAddr 0x0E00//Start Tx data #define LR_RegFifoRxBaseAddr 0x0F00//Start Rx data #define LR_RegFifoRxCurrentaddr 0x1000//Start address of last packet received #define LR_RegIrqFlagsMask 0x1100//Optional IRQ flag mask #define LR_RegIrqFlags 0x1200//IRQ flags #define LR_RegRxNbBytes 0x1300//Number of received bytes #define LR_RegRxHeaderCntValueMsb 0x1400//Number of valid headers received #define LR_RegRxHeaderCntValueLsb 0x1500// #define LR_RegRxPacketCntValueMsb 0x1600//Number of valid packets received #define LR_RegRxPacketCntValueLsb 0x1700 #define LR_RegModemStat 0x1800//Live LoRa TM modem status #define LR_RegPktSnrValue 0x1900//Espimation of last packetSNR #define LR_RegPktRssiValue 0x1A00//RSSI of last packet #define LR_RegRssiValue 0x1B00//Current RSSI #define LR_RegHopChannel 0x1C00//FHSS start channel #define LR_RegModemConfig1 0x1D00//Modem PHY config 最重要的寄存器包括Signal bandwidth:Error coding rate,Explicit Header mode #define LR_RegModemConfig2 0x1E00//SF rate, #define LR_RegSymbTimeoutLsb 0x1F00//Receiver timeout value #define LR_RegPreambleMsb 0x2000//Size of preamble #define LR_RegPreambleLsb 0x2100// #define LR_RegPayloadLength 0x2200//LoRa TM payload length #define LR_RegMaxPayloadLength 0x2300//LoRaTM maximum pay-load length #define LR_RegHopPeriod 0x2400//FHSS Hop period #define LR_RegFifoRxByteAddr 0x2500//Address of last bytewritten in FIFO #define LR_RegModemConfig3 0x2600//Modem PHY config 3 // I/O settings #define REG_LR_DIOMAPPING1 0x4000 #define REG_LR_DIOMAPPING2 0x4100 // Version #define REG_LR_VERSION 0x4200 // Additional settings #define REG_LR_PLLHOP 0x4400 #define REG_LR_TCXO 0x4B00//TCXO or XTAL input setting #define REG_LR_PADAC 0x4D00//Higher power settings of the PA #define REG_LR_FORMERTEMP 0x5B00//Stored temperature during the former IQ Calibration #define REG_LR_AGCREF 0x6100//Adjustment of the AGC thresholds #define REG_LR_AGCTHRESH1 0x6200 #define REG_LR_AGCTHRESH2 0x6300 #define REG_LR_AGCTHRESH3 0x6400 #endif //__SX1276_LORA_H__ #include "sx1278_LoRa.h" #include "stm32f10x_spi.h" #include #define u8 unsigned char #define u16 unsigned short #define gb_SF 3 #define gb_BW 6 #define CR 0x04 #define CRC_EN 0x00 //CRC Enable /********************************************************** **Parameter table define **********************************************************/ static const u16 RFM96FreqTbl[3] = {0x066C, 0x0780, 0x0800}; //434MHz 32M晶振0x066C, 0x0780, 0x0800 30M:0x0673, 0x07BB, 0x08BB {0x85,0x89,0xd9},//26M-TCXO 434M static const u16 RFM96PowerTbl[4] = { 0x09FF, //20dbm 0x09FC, //17dbm 0x09F9, //14dbm 0x09F6, //11dbm }; /* const u8 RFM96SpreadFactorTbl[7] = { 6,7,8,9,10,11,12 }; */ static const u8 RFM96SpreadFactorTbl[6] = { 7,8,9,10,11,12 };//由于6扩频因子档位只能是固定数据包长所以去掉6扩频因子档位 static const u8 RFM96LoRaBwTbl[10] = {// 0 1 2 3 4 5 6 7 8 9 //7.8KHz,10.4KHz,15.6KHz,20.8KHz,31.2KHz,41.7KHz,62.5KHz,125KHz,250KHz,500KHz 0,1,2,3,4,5,6,7,8,9 }; extern void bsp_DelayMS(uint32_t n); extern void bsp_DelayUS(uint32_t n); /********************************************************** **Name: SPICmd8bit **Function: SPI Write one byte **Input: WrPara **Output: none **note: use for burst mode **********************************************************/ u8 SPICmd8bit(u8 WrPara) { /* Loop while DR register in not emplty */ while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); /* Send byte through the SPI1 peripheral */ SPI_I2S_SendData(SPI1, WrPara); /* Wait to receive a byte */ while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); /* Return the byte read from the SPI bus */ return SPI_I2S_ReceiveData(SPI1); } /********************************************************** **Name: SPIRead8bit **Function: SPI Read one byte **Input: None **Output: result byte **Note: use for burst mode **********************************************************/ //u8 SPIRead8bit(void) //{ // return SPICmd8bit(0XFF); //} /********************************************************** **Name: SPIRead **Function: SPI Read CMD **Input: adr -> address for read **Output: None **********************************************************/ u8 SPIRead(u8 adr) { static u8 tmp; RF_CS_Low;//NSS_Low; bsp_DelayUS(1); SPICmd8bit(adr&0x7f); //Send address first tmp = SPICmd8bit(0XFF); // printf("读addr:%02x val:%02x\n",adr,tmp); bsp_DelayUS(1); RF_CS_High;//NSS_High; return(tmp); } /********************************************************** **Name: SPIWrite **Function: SPI Write CMD **Input: WrPara -> address & data **Output: None **********************************************************/ void SPIWrite(u16 WrPara) { WrPara |= 0x8000; //MSB must be "1" for write // printf("写addr:%02x val:%02x\n",WrPara>>8,(u8)WrPara); RF_CS_Low;//NSS_Low; bsp_DelayUS(1); SPICmd8bit(WrPara>>8);// 15->0 SPICmd8bit((u8)WrPara); bsp_DelayUS(1); RF_CS_High;//NSS_High; } /********************************************************** **Name: SPIBurstRead **Function: SPI burst read mode **Input: adr-----address for read ** ptr-----data buffer point for read ** length--how many bytes for read **Output: None **********************************************************/ void SPIBurstRead(u8 adr, u8 *ptr, u8 length) { static u8 i; if(length>8)); // printf("RFM96FreqTbl[0](0X06_6C) R:0x%02X",Sx1276VerNO); for(i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3